#ifndef __MY_HOT__
#define __MY_HOT__

#include "data.hpp"
#include <unistd.h>

extern cloud::DataManager *_data;

namespace cloud
{
    // 热点管理类
    class HotManager
    {
    public:
        HotManager()
        {
            // 从配置文件获取信息
            Config *config = Config::GetInstance();

            _pack_dir = config->GetPackDir();
            _pack_suffix = config->GetPackFileSuffix();
            _back_dir = config->GetBackDir();
            _hot_time = config->GetHotTime();

            // 目录不存在直接创建
            FileUtil tmp1(_pack_dir);
            FileUtil tmp2(_back_dir);
            tmp1.CreateDirectory();
            tmp2.CreateDirectory();
        }

        bool RunModule()
        {
            //实时监测热点文件
            while (1)
            {
                // 1.遍历备份目录，获取所有的文件路径名
                FileUtil fu(_back_dir);
                std::vector<std::string> array;
                // 将获取的文件名存放到array
                fu.ScanDirectory(&array);

                // 2.逐个判断是否为热点文件
                for (auto &e : array)
                {
                    if (HotJudge(e) == false)
                    {
                        // 热点文件不做处理
                        continue;
                    }

                    // 3.获取文件的备份信息
                    BackupInfo bi;
                    // 防止有备份文件的信息没有录入
                    if (_data->GetOneByRealPath(e, &bi) == false)
                    {
                        // 将当前文件信息进行重新设置
                        bi.NewBackupInfo(e);
                    }

                    // 4.对非热点文件进行压缩处理
                    FileUtil tmp(e);
                    tmp.Compress(bi.pack_path); // 压缩+压缩后缀名
                    // 5.删除源文件，修改备份信息
                    tmp.Remove();
                    bi.pack_flag = true;
                    _data->UpDate(bi); // 更新数据
                }
                //休眠，减少CUP运行
                usleep(1000);
            }
            return true;
        }

    private:
        // 非热点文件判断:非热点true，热点false
        bool HotJudge(const std::string &filename)
        {
            FileUtil fu(filename);

            // 文件最后访问时间
            time_t last_time = fu.LastATime();
            time_t now_time = time(nullptr);

            // 当前系统时间 - 最后访问时间
            if (now_time - last_time <= _hot_time)
                return true;

            return false;
        }

    private:
        std::string _pack_dir;
        std::string _pack_suffix; // 压缩包后缀名
        std::string _back_dir;
        size_t _hot_time; // 热点时间
    };
}

#endif